#!/usr/bin/perl -w

use strict;
use XML::Simple;
use IO::Handle;
STDOUT->autoflush(1);

my $cfgfile = shift;
if (not defined $cfgfile) {
	if (not defined $ENV{'HACKABOT_ETC'}) {
		die "Error HACKABOT_ETC is undefined";
	}
	$cfgfile = "$ENV{'HACKABOT_ETC'}/acl.xml";
}

my $ACCESS = XMLin($cfgfile,
	ForceArray => ['command', 'public', 'person'],
	KeyAttr => { command => "name", public => 'chan', person => 'nick' });

my %event;
while (<>) {
	if (/^type\s*(\S*)/) {
		$event{'type'} = $1;
	}
	elsif (/^to\s*(\S*)/) {
		$event{'to'} = $1;
	}
	elsif (/^nick\s*(\S*)/) {
		$event{'nick'} = $1;
	}
	elsif (/^msg\s*(.*)/) {
		$event{'msg'} = $1;
	}
}

if (not defined $event{'msg'} or not $event{'msg'} =~ /^!(\S*)/) {
	exit;
}

if ($event{'type'} eq 'pubmsg') {
	$event{'msg'} =~ /^!(\S*)/;
	my $cmd = $1;
	if (defined $ACCESS->{'command'}->{$cmd}) {
		if (defined $ACCESS->{'command'}->{$cmd}->{'public'}->{$event{'to'}}) {
			if (defined $ACCESS->{'command'}->{$cmd}->{'public'}->{$event{'to'}}->{'person'}->{$event{'nick'}}) {
				doaction($ACCESS->{'command'}->{$cmd}->{'public'}->{$event{'to'}}->{'person'}->{$event{'nick'}}->{'action'}, 
					$event{'nick'},
					$ACCESS->{'command'}->{$cmd}->{'public'}->{$event{'to'}}->{'person'}->{$event{'nick'}}->{'msg'});
			}
			else {
				doaction($ACCESS->{'command'}->{$cmd}->{'public'}->{$event{'to'}}->{'action'}, $event{'nick'},
					$ACCESS->{'command'}->{$cmd}->{'public'}->{$event{'to'}}->{'msg'});
			}
		}
		elsif (defined $ACCESS->{'command'}->{$cmd}->{'person'}->{$event{'nick'}}) {
			doaction($ACCESS->{'command'}->{$cmd}->{'person'}->{$event{'nick'}}->{'action'}, 
				$event{'nick'},
				$ACCESS->{'command'}->{$cmd}->{'person'}->{$event{'nick'}}->{'msg'});
		}
		else {
			doaction($ACCESS->{'command'}->{$cmd}->{'action'}, $event{'nick'},
				$ACCESS->{'command'}->{$cmd}->{'msg'});
		}
	}
	else {
		if (defined $ACCESS->{'default'}->{'public'}->{$event{'to'}}) {
			if (defined $ACCESS->{'default'}->{'public'}->{$event{'to'}}->{'person'}->{$event{'nick'}}) {
				doaction($ACCESS->{'default'}->{'public'}->{$event{'to'}}->{'person'}->{$event{'nick'}}->{'action'}, 
					$event{'nick'},
					$ACCESS->{'default'}->{'public'}->{$event{'to'}}->{'person'}->{$event{'nick'}}->{'msg'});
			}
			else {
				doaction($ACCESS->{'default'}->{'public'}->{$event{'to'}}->{'action'}, $event{'nick'},
					$ACCESS->{'default'}->{'public'}->{$event{'to'}}->{'msg'});
			}
		}
		elsif (defined $ACCESS->{'default'}->{'person'}->{$event{'nick'}}) {
			doaction($ACCESS->{'default'}->{'person'}->{$event{'nick'}}->{'action'}, 
				$event{'nick'},
				$ACCESS->{'default'}->{'person'}->{$event{'nick'}}->{'msg'});
		}
		else {
			doaction($ACCESS->{'default'}->{'action'}, $event{'nick'}, 
				$ACCESS->{'default'}->{'msg'});
		}
	}
}	
elsif ($event{'type'} eq 'privmsg') {
	$event{'msg'} =~ /^!(\S*)/;
	my $cmd = $1;
	if (defined $ACCESS->{'command'}->{$cmd}) {
		if (defined $ACCESS->{'command'}->{$cmd}->{'private'}) {
			if (defined $ACCESS->{'command'}->{$cmd}->{'private'}->{'person'}->{$event{'nick'}}) {
				doaction($ACCESS->{'command'}->{$cmd}->{'private'}->{'person'}->{$event{'nick'}}->{'action'}, 
					$event{'nick'},
					$ACCESS->{'command'}->{$cmd}->{'private'}->{'person'}->{$event{'nick'}}->{'msg'});
			}
			else {
				doaction($ACCESS->{'command'}->{$cmd}->{'private'}->{'action'}, $event{'nick'},
					$ACCESS->{'command'}->{$cmd}->{'private'}->{'msg'});
			}
		}
		elsif (defined $ACCESS->{'command'}->{$cmd}->{'person'}->{$event{'nick'}}) {
			doaction($ACCESS->{'command'}->{$cmd}->{'person'}->{$event{'nick'}}->{'action'}, 
				$event{'nick'},
				$ACCESS->{'command'}->{$cmd}->{'person'}->{$event{'nick'}}->{'msg'});
		}
		else {
			doaction($ACCESS->{'command'}->{$cmd}->{'action'}, $event{'nick'},
				$ACCESS->{'command'}->{$cmd}->{'msg'});
		}
	}
	else {
		if (defined $ACCESS->{'default'}->{'private'}->{$event{'to'}}) {
			if (defined $ACCESS->{'default'}->{'private'}->{$event{'to'}}->{'person'}->{$event{'nick'}}) {
				doaction($ACCESS->{'default'}->{'private'}->{$event{'to'}}->{'person'}->{$event{'nick'}}->{'action'}, 
					$event{'nick'},
					$ACCESS->{'default'}->{'private'}->{$event{'to'}}->{'person'}->{$event{'nick'}}->{'msg'});
			}
			else {
				doaction($ACCESS->{'default'}->{'private'}->{$event{'to'}}->{'action'}, $event{'nick'},
					$ACCESS->{'default'}->{'private'}->{$event{'to'}}->{'msg'});
			}
		}
		elsif (defined $ACCESS->{'default'}->{'person'}->{$event{'nick'}}) {
			doaction($ACCESS->{'default'}->{'person'}->{$event{'nick'}}->{'action'}, 
				$event{'nick'},
				$ACCESS->{'default'}->{'person'}->{$event{'nick'}}->{'msg'});
		}
		else {
			doaction($ACCESS->{'default'}->{'action'}, $event{'nick'}, 
				$ACCESS->{'default'}->{'msg'});
		}
	}
}	

sub doaction {
	my $action = shift;
	my $nick = shift;
	my $msg = shift;

	if ($action eq 'deny') {
		print "nocmd\n";
	}
	if (defined $msg) {
		print "send $nick: $msg\n";
	}
}
	
